今天发现已经正常运行了几个月的一个 Node 节点处于 NotReady
状态. 登陆机器发现 Docker 进程已经退出.
排查 docker 退出原因
怀疑 2 种情况: 其一是系统重启, 没做 docker 随系统启动; 另一种是 docker 自己挂掉了.
排查第一种情况:
查看系统重启日志 sudo tail -n 20 /var/log/boot.log*
发现最后日志距离 docker 退出时间相差 2 个月左右, 明显不是系统重启引起的 docker 问题.
排查第二种情况:
使用 journalctl -u docker.service
查看 Docker 日志出现报错如下, 只有一句弱弱的
1 | systemd: Stopped Docker Application Container Engine. |
只能知道确实是自己退出了.
继续追查退出的原因
进入目录 /var/log/
查看 messages*
文件, 查找在 docker 挂掉前半小时左右的日志内容.
1 | kernel: Out of memory: Kill process 23607 (containerd) score 10 or sacrifice |
说明是因为内存不足, 造成系统 OOM 投票将 docker 相关进程杀掉.
查看 Node 当前使用资源
kubectl describe node <NODENAME>
可以看到资源使用情况
1 | Non-terminated Pods: (12 in total) |
解决办法
给 Pod 限制资源(CPU, RAM)的使用
管理资源分为 Requests 和 Limits, 其中 Request 在创建 pod 时决定在哪个 Node 上运行, Limit 则在运行时确保不超出这个限制. 这意味着 Node 上资源充足, 使用的资源会超出 Requests, 但是绝对不会超出 Limits.
1 | resources: |
参考 Managing Resources for Containers